<?php

function getArrayFromFile($file) {
    $array = file($file);
    foreach ($array as &$item) {
        $item = trim($item);
    }unset($item);
    return array_unique(array_filter($array));
}

function get_array_from_file($file) {
    return getArrayFromFile($file);
}

function add_run_lock($file, $flag = 1) {
    $lockfile = APP_ROOT_DIR . '/data/locks/' . basename($file) . '_' . $flag . '.lock';
    log::n('add run lock for program,lockfile[' . $lockfile . ']');
    fcheckdir($lockfile);
    file_put_contents($lockfile, date('Y-m-d H:i:s'));
}

function unlock_run_lock($file, $flag = 1) {
    $lockfile = APP_ROOT_DIR . '/data/locks/' . basename($file) . '_' . $flag . '.lock';
    log::n('delete run lock for program,lockfile[' . $lockfile . ']');
    @unlink($lockfile);
}

function check_run_lock($file, $flag = 1) {
    $lockfile = APP_ROOT_DIR . '/data/locks/' . basename($file) . '_' . $flag . '.lock';
    if (file_exists($lockfile)) {
        log::w('lockfile[' . $lockfile . ']');
        log::w('run lock has been added @[' . file_get_contents($lockfile) . ']');
        die();
    }
    log::n('lockfile check success');
}

function getLocalIp() {
    $opts = array(
        'http' => array(
            'method' => "GET",
            'timeout' => 10,
        )
    );
    $context = stream_context_create($opts);

    $localIp = file_get_contents('http://imail.sinaapp.com/ip.php', false, $context);
    if (!$localIp) {
        $localIp = file_get_contents('http://imail.sinaapp.com/ip.php', false, $context);
    }
    return $localIp;
}

function debug() {
    $trace = debug_backtrace();
    $count = count($trace);
    $last = $trace[$count - 1];
    return $last;
}

/**
 * 日志输出
 * @param type $msg
 */
function logformat($msg) {
    $last = debug();
    $traceInfo = basename($last['file']) . '|' . $last['line'] . '|' . $last['function'];
    $s = date('Y-m-d H:i:s') . '|' . str_pad($msg, 80) . '|' . $traceInfo . '|' . PHP_EOL;
    echo $s;
}

//检查并创建多级目录
function FCheckDir($path) {
    $pathArray = explode('/', $path);
    $nowPath = '';
    array_pop($pathArray);
    foreach ($pathArray as $key => $value) {
        if ('' == $value) {
            unset($pathArray[$key]);
        } else {
            if ($key == 0) {
                $nowPath .= $value;
            } else {
                $nowPath .= '/' . $value;
            }
            if (!is_dir($nowPath)) {
                if (!mkdir($nowPath, 0777)) {
                    return false;
                }
            }
        }
    }
    return true;
}

function Number2Letter($number) {
    if (!is_numeric($number) || $number < 0 || strlen($number) == 0) {
        return false;
    }
    $string = '';
    $array = str_split(strval($number));
    foreach ($array as $int) {
        if (mt_rand(0, 10) > 6) {
            $string.=strval($int);
        } else {
            $rand = array();
            for ($i = 64; $i <= 90; $i++) {
                if (substr(strval($i), -1, 1) == $int) {
                    $rand[] = chr(intval($i));
                }
            }
            $key = mt_rand(0, count($rand) - 1);

            $string.=strtoupper($rand[$key]);
        }
    }
    return $string;
}

function Letter2Number($letter) {
    $letter = strtoupper($letter);
    $number = '';
    $array = str_split(strval($letter));
    if (empty($array)) {
        return false;
    }
    foreach ($array as $str) {
        if (is_numeric($str)) {
            $number.=strval($str);
        } else {
            $ascii = ord($str);
            if ($ascii > 90 || $ascii < 64) {
                return false;
            }
            $number.=strval(substr($ascii, -1, 1));
        }
    }
    return intval($number);
}

/**
 * xml转数组
 * @param type $xml
 * @return type
 */
function Xml2Array($contents, $get_attributes = 1, $priority = 'tag') {
    if (!$contents)
        return array();

    if (!function_exists('xml_parser_create')) {
        //print "'xml_parser_create()' function not found!"; 
        return array();
    }

    //Get the XML parser of PHP - PHP must have this module for the parser to work 
    $parser = xml_parser_create('');
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss 
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);

    if (!$xml_values)
        return; //Hmm... 

    $xml_array = array();
    $parents = array();
    $opened_tags = array();
    $arr = array();

    $current = &$xml_array; //Refference 
    //Go through the tags. 
    $repeated_tag_index = array(); //Multiple tags with same name will be turned into an array 
    foreach ($xml_values as $data) {
        unset($attributes, $value); //Remove existing values, or there will be trouble 
        //This command will extract these variables into the foreach scope 
        // tag(string), type(string), level(int), attributes(array). 
        extract($data); //We could use the array by itself, but this cooler. 

        $result = array();
        $attributes_data = array();

        if (isset($value)) {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode 
        }

        //Set the attributes too. 
        if (isset($attributes) and $get_attributes) {
            foreach ($attributes as $attr => $val) {
                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' 
            }
        }

        //See tag status and do the needed. 
        if ($type == "open") {//The starting of the tag '<tag>' 
            $parent[$level - 1] = &$current;
            if (!is_array($current) or (!in_array($tag, array_keys($current)))) { //Insert New tag 
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;

                $current = &$current[$tag];
            } else { //There was another element with the same tag name 
                if (isset($current[$tag][0])) {//If there is a 0th element it is already an array 
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level] ++;
                } else {//This section will make the value an array if multiple tags with the same name appear together 
                    $current[$tag] = array($current[$tag], $result); //This will combine the existing item and the new item together to make an array
                    $repeated_tag_index[$tag . '_' . $level] = 2;

                    if (isset($current[$tag . '_attr'])) { //The attribute of the last(0th) tag must be moved as well 
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = &$current[$tag][$last_item_index];
            }
        } elseif ($type == "complete") { //Tags that ends in 1 line '<tag />' 
            //See if the key is already taken. 
            if (!isset($current[$tag])) { //New Key 
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            } else { //If taken, put all things inside a list(array) 
                if (isset($current[$tag][0]) and is_array($current[$tag])) {//If it is already an array... 
                    // ...push the new element into that array. 
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;

                    if ($priority == 'tag' and $get_attributes and $attributes_data) {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level] ++;
                } else { //If it is not an array... 
                    $current[$tag] = array($current[$tag], $result); //...Make it an array using using the existing value and the new value
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes) {
                        if (isset($current[$tag . '_attr'])) { //The attribute of the last(0th) tag must be moved as well 
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset($current[$tag . '_attr']);
                        }

                        if ($attributes_data) {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level] ++; //0 and 1 index is already taken 
                }
            }
        } elseif ($type == 'close') { //End of tag '</tag>' 
            $current = &$parent[$level - 1];
        }
    }
    return($xml_array);
}

?>